#include "vl_prop.h"

using namespace VL;


/**
 * @Author: CimZzz
 * @Date: 2022-06-21 10:58:20
 * 
 * 空节点
 */
std::shared_ptr<VLProp> VLProp::EMPTY = std::shared_ptr<VLProp>(new VLProp(VLProp::PropType::Empty));

/**
 * @Author: CimZzz
 * @Date: 2022-06-16 15:17:43
 * 
 * 构造方法
 * @param type 属性类型
 */
VLProp::VLProp(PropType type): name("") {
	this->type = type;
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-16 20:30:11
 * 
 * 获取属性类型
 * @return 返回属性类型
 */
VLProp::PropType VLProp::getType() {
	return this->type;
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-16 20:18:47
 * 
 * 获取属性名
 * @return 返回属性名
 */
std::string VLProp::getName() {
	return this->name;
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-16 20:19:17
 * 
 * 设置属性名
 * @param name 属性名
 */
void VLProp::setName(std::string name) {
	this->name = name;
}


/**
 * @Author: CimZzz
 * @Date: 2022-06-21 11:00:20
 * 
 * 判断当前节点是否为空节点
 */
bool VLProp::isEmpty() {
	return this->type == VLProp::PropType::Empty;
}



/**
 * @Author: CimZzz
 * @Date: 2022-07-13 14:43:21
 * 
 * 判断当前节点是否为根结点
 * @return 如果是返回 true
 */
bool VLProp::isRoot() {
	return this->type == VLProp::PropType::Root;
}

/**
 * @Author: CimZzz
 * @Date: 2022-07-13 14:43:21
 * 
 * 判断当前节点是否为映射表
 * @return 如果是返回 true
 */
bool VLProp::isMap() {
	return this->type == VLProp::PropType::Map || this->type == VLProp::PropType::Root;
}

/**
 * @Author: CimZzz
 * @Date: 2022-07-13 14:43:21
 * 
 * 判断当前节点是否为数组
 * @return 如果是返回 true
 */
bool VLProp::isArray() {
	return this->type == VLProp::PropType::Array;
}

/**
 * @Author: CimZzz
 * @Date: 2022-07-13 14:43:21
 * 
 * 判断当前节点是否为单节点
 * @return 如果是返回 true
 */
bool VLProp::isNode() {
	return this->type == VLProp::PropType::Node;
}

/**
 * @Author: CimZzz
 * @Date: 2022-08-25 20:07:10
 * 
 * 判断当前节点是否为容器结点
 * 
 * @return 如果是返回 true
 */
bool VLProp::isContainer() {
	return this->isArray() || this->isMap();
}

/**
 * @Author: CimZzz
 * @Date: 2022-08-25 20:08:16
 * 
 * 克隆当前属性
 * 
 * @return 属性指针
 */
VLProp* VLProp::clone() {
	return new VLProp(*this);
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-27 14:35:29
 * 
 * 获取属性值
 * @return 属性值
 */
std::string VLProp::getValue() {
	return "";
}


/**
 * @Author: CimZzz
 * @Date: 2022-06-30 18:22:06
 * 
 * 比较两个 Array 之间的区别
 * @param prop 属性指针
 * @return 如果相同返回 true
 */
bool VLProp::diff(VLProp* prop) {
	return false;
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-30 18:22:06
 * 
 * 比较两个 Array 之间的区别
 * @param prop 属性指针
 * @return 如果相同返回 true
 */
bool VLProp::diff(std::shared_ptr<VLProp> prop) {
	return this->diff(prop.get());
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-30 19:14:40
 * 
 * 组合属性
 * @param prop 属性指针
 * 
 * @return 组合成功返回 false
 */
bool VLProp::combine(std::shared_ptr<VLProp>& prop) {
	return false;
}


/**
 * @Author: CimZzz
 * @Date: 2022-06-21 11:04:46
 * 
 * 构建属性打印信息
 */
std::string VLProp::buildPropPrintInfo() {
	return "";
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-21 10:53:58
 * 
 * 打印属性节点信息
 */
void VLProp::print() {
	this->printWithPrefix("");
}

/**
 * @Author: CimZzz
 * @Date: 2022-06-21 15:16:41
 * 
 * 打印属性节点信息, 设置前缀
 * @param prefix 前缀
 */
void VLProp::printWithPrefix(std::string prefix) {
	switch(this->type) {
		case Empty:
			printf("%sEmptyProp%s\n", prefix.c_str(), this->buildPropPrintInfo().c_str());
		break;
		case Root:
			printf("%sRootProp%s\n", prefix.c_str(), this->buildPropPrintInfo().c_str());
		break;
		case Node:
			printf("%sNodeProp%s\n", prefix.c_str(), this->buildPropPrintInfo().c_str());
		break;
		case Array:
			printf("%sArrayProp%s\n", prefix.c_str(), this->buildPropPrintInfo().c_str());
		break;
		case Map:
			printf("%sMapProp%s\n", prefix.c_str(), this->buildPropPrintInfo().c_str());
		break;
	}
}
